package org.example.template;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.List;
import java.util.Map;

/**
 * 注解对象的实现类
 *
 * @param <T> 自定义注解的类型
 */
public interface IBootstrap<T extends Annotation> {

    /**
     * 在全局扫描被泛型注解标记的类
     *
     * @param classes 被泛型标对象记的所有类对象
     */
    void initClassByAnnotation(List<Class<?>> classes, Class<? extends Annotation> aClass);

    /**
     * 在颗粒容器中寻找成员变量被泛型注解标记的对象以及成员变量
     *
     * @param map    成员变量被泛型标记的所有对象以及其成员变量
     * @param aClass 泛型的类对象
     */
    void initFiledByAnnotation(Map<Object, List<Field>> map, Class<? extends Annotation> aClass);

    /**
     * 在颗粒容器中寻找方法被泛型注解标记的对象以及其方法对象
     *
     * @param map    方法被泛型标记的所有对象以及其方法对象
     * @param aClass 泛型的类对象
     */
    void initMethodByAnnotation(Map<Object, List<Method>> map, Class<? extends Annotation> aClass);

    /**
     * 在颗粒容器中寻找方法参数被泛型标记的对象以及其方法和方法参数对象
     *
     * @param map    方法参数被泛型标记的所有对象以及其方法与参数对象集合
     * @param aClass 泛型的类对象
     */
    void initParameterByAnnotation(Map<Object, Map<Method, List<Parameter>>> map, Class<? extends Annotation> aClass);
}
